﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.IO;
using System.Windows.Forms;
namespace binary
{
    class MyMemo
    {
        private string tekst = "";
        public bool pracuje = false;

        public MyMemo()
        {
 
        }

        public string getTekst(string plik, int numer)
        {
            
            using (BinaryReader b = new BinaryReader(File.Open(plik, FileMode.Open, FileAccess.Read)))
            {
                int rozmiar_tekstu;
                int rozmiar_bloku;
                int rozmiar;
                int typ;
                string tekst;

                b.BaseStream.Seek(4, SeekOrigin.Begin);
                rozmiar_tekstu = BitConverter.ToInt32(this.odwrocBajty(b.ReadBytes(4)), 0) - 8;
                rozmiar_bloku = rozmiar_tekstu + 8;

                b.BaseStream.Seek(512, SeekOrigin.Begin);

                for (int i = 1; i <= numer; i++)
                {
                    typ = BitConverter.ToInt32(this.odwrocBajty(b.ReadBytes(4)), 0);
                    rozmiar = BitConverter.ToInt32(this.odwrocBajty(b.ReadBytes(4)), 0);

                    if (i == numer)
                    {
                        tekst = Encoding.ASCII.GetString(b.ReadBytes(rozmiar));
                        return tekst;
                    }
                    else
                    {
                        if (rozmiar > rozmiar_tekstu)
                        {
                            
                            double liczba_pelnych = ((double)(rozmiar + 8) / (double)rozmiar_bloku);
                            long przesun = (long)((Math.Ceiling(liczba_pelnych)) * rozmiar_bloku) - 8;
                            b.BaseStream.Seek(przesun, SeekOrigin.Current);
                        }
                        else
                        {
                            b.BaseStream.Seek(rozmiar_bloku-8, SeekOrigin.Current);
                        }
                    }

                }
                b.Close();
                return ""; 
            }
           

        }

        public string getTekst2(string plik, int numer, int typ_pliku)
        {
            this.pracuje = true;
            using (BinaryReader b = new BinaryReader(File.Open(plik, FileMode.Open, FileAccess.Read)))
            {
                int rozmiar_tekstu;
                int rozmiar_bloku;
                int rozmiar;
                int typ;
                string tekst;

                b.BaseStream.Seek(4, SeekOrigin.Begin);
                rozmiar_tekstu = BitConverter.ToInt32(this.odwrocBajty(b.ReadBytes(4)), 0) - 8;
                rozmiar_bloku = rozmiar_tekstu + 8;


                b.BaseStream.Seek(512 + ((numer-8) * rozmiar_bloku), SeekOrigin.Begin);
                
                typ = BitConverter.ToInt32(this.odwrocBajty(b.ReadBytes(4)), 0);
                rozmiar = BitConverter.ToInt32(this.odwrocBajty(b.ReadBytes(4)), 0);
              
                if(typ_pliku==0)
                    tekst = Encoding.GetEncoding(852).GetString(b.ReadBytes(rozmiar));
                else
                    tekst = Encoding.GetEncoding(1250).GetString(b.ReadBytes(rozmiar));
                this.pracuje = false;
                b.Close();
                return tekst;
            }
        }

        private byte[] odwrocBajty(byte[] tab)
        {
            byte[] tab2 = new byte[tab.Length];
            int licznik = 0;
            for (int i = tab.Length - 1; i >= 0; i--)
            {
                tab2[licznik] = tab[i];
                licznik++;
            }
            return tab2;
        }

    }
}
